﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Data.Common;
using System.Reflection;
using System.Data.OleDb;
using System.Data.OracleClient;
using Dominio;

namespace Persistencia
{
    public class AlunoDAO
    {
        protected int _count = 0;
        protected SqlConnection conn = null;
        protected void closeConexao()
        {
            GerenciadorConexao.closeConexao(conn);
            conn = null;
        }
        protected void abrirConexao()
        {
            if (conn.State != ConnectionState.Open)
                conn.Open();
        }
        public int selectCountAll()
        {
            return _count;
        }
        #region métodos auxiliares
        private String getNomeTabela() {
            return "Aluno";
        }
        private String getSelect()
        {
            return "select * " +
            "from " + this.getNomeTabela();
        }

        protected DbParameter novoParametro(String nome, DbType tipo, Object valor)
        {
            SqlParameter par = new SqlParameter();
            par.ParameterName = nome;
            if (tipo !=null)
                par.DbType = tipo;
            if (valor != null)
                par.Value = valor;
            return par;

        }
        private AlunoVO getEntidade(DbDataReader dr)
        {
            AlunoVO aluno = new AlunoVO();

            try
            {
                aluno.id = (int)dr["id"];
                aluno.Nome = (string)dr["nome"].ToString().Trim();
                aluno.Matricula = (string)dr["matricula"].ToString().Trim();
                aluno.Cidade = (string)dr["cidade"].ToString().Trim();
                aluno.Estado = (string)dr["estado"].ToString().Trim();
                aluno.Nacionalidade = (string)dr["nacionalidade"].ToString().Trim();                
                aluno.Pai = (string)dr["filiacaopai"].ToString().Trim();
                aluno.Mae = (string)dr["filiacaomae"].ToString().Trim();
                aluno.Endereco = (string)dr["endereco"].ToString().Trim();
                aluno.DataNascimento = (DateTime)dr["dnascimento"];
                aluno.Sexo = Convert.ToChar((string)dr["sexo"]);
                aluno.Id_turma = (int)dr["id_turma"];
               
                
                
            }
            catch (Exception)
            {
            }
            return aluno;
        }
        #endregion
        #region métodos acessadores
        public IList<AlunoVO> list(string nome, string matricula)
        {
            return this.recuperarAlunos(nome, matricula);
        }
        /// <summary>
        /// Exibe todos os objetos cadastrados.
        /// </summary>
        /// <returns>Retorna a lista de objetos da classe T.</returns>
        
        private List<AlunoVO> recuperarAlunos(string nome, string matricula)
        {
            List<AlunoVO> alunos = new List<AlunoVO>();
            conn = GerenciadorConexao.getConexao();
            SqlCommand command = new SqlCommand(this.getSelect() + " where nome LIKE '%' + @parNome + '%' and matricula LIKE '%' + @parMatricula + '%' ORDER BY matricula desc", conn);
            
            string _nome = nome;
            string _matricula = matricula;
            if (_matricula == null) _matricula = "";
            if (_nome == null) _nome = "";

            abrirConexao();
            try
            {
                command.Parameters.Add(this.novoParametro("@parNome", DbType.String, _nome));
                command.Parameters.Add(this.novoParametro("@parMatricula", DbType.String, _matricula));
                DbDataReader dr = command.ExecuteReader();
                try
                {
                    if (dr.HasRows)
                    {
                        while (dr.Read())
                        {
                            alunos.Add(this.getEntidade(dr));
                        }
                    }
                }
                finally { dr.Close(); }
            }
            finally { closeConexao(); }

            return alunos;
        }
        public AlunoVO findByPrimaryKey(int id)
        {
            //Activator.CreateInstance(
            AlunoVO vo = new AlunoVO();
            conn = GerenciadorConexao.getConexao();
            
            SqlCommand command = new SqlCommand(this.getSelect() + " where id = @parID", conn);

            abrirConexao();
            try
            {
                command.Parameters.Add(this.novoParametro("parID", DbType.Int32,id));
                DbDataReader dr = command.ExecuteReader();
                try
                {
                    if (dr.HasRows)
                    {
                        dr.Read();
                        vo = this.getEntidade(dr);
                    }
                }
                finally { dr.Close(); }
            }
            finally { closeConexao(); }

            return vo;
        }

        #endregion
        #region métodos modificadores
        public int inserir(AlunoVO vo, int id_Turma)
        {
            int retorno = 0;

            conn = GerenciadorConexao.getConexao();

            SqlCommand command = new SqlCommand();
            command.CommandText = "INSERT INTO " + this.getNomeTabela() + " (matricula, nome, sexo, dnascimento, cidade, estado, "+
            "nacionalidade, filiacaomae, filiacaopai, endereco, ID_turma) VALUES (@matricula, @nome, @sexo, @dnascimento, @cidade, @estado, "+
            "@nacionalidade, @filiacaomae, @filiacaopai, @endereco, @id_Turma)";

            command.Connection = conn;
            command.Parameters.Add(this.novoParametro("matricula", DbType.String,vo.Matricula));
            command.Parameters.Add(this.novoParametro("nome", DbType.String, vo.Nome));
            command.Parameters.Add(this.novoParametro("sexo", DbType.String, vo.Sexo));
            command.Parameters.Add(this.novoParametro("dnascimento", DbType.Date, vo.DataNascimento));
            command.Parameters.Add(this.novoParametro("cidade", DbType.String, vo.Cidade));
            command.Parameters.Add(this.novoParametro("estado", DbType.String, vo.Estado));
            command.Parameters.Add(this.novoParametro("nacionalidade", DbType.String, vo.Nacionalidade));
            command.Parameters.Add(this.novoParametro("filiacaomae", DbType.String, vo.Mae));
            command.Parameters.Add(this.novoParametro("filiacaopai", DbType.String, vo.Pai));
            command.Parameters.Add(this.novoParametro("endereco", DbType.String, vo.Endereco));
            command.Parameters.Add(this.novoParametro("id_Turma", DbType.Int32, id_Turma));

            try
            {
                abrirConexao();
                
                retorno = command.ExecuteNonQuery();
                if (retorno > 0)
                    vo.id = GerenciadorConexao.getId(this.getNomeTabela());
                return retorno;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
            finally
            {
                closeConexao();
            }
        }

        public virtual int alterar(AlunoVO vo, int id_turma)
        {
            int retorno = 0;

            conn = GerenciadorConexao.getConexao();

            SqlCommand command = new SqlCommand();
            command.CommandText = "UPDATE " + this.getNomeTabela() + " set nome = @nome, " +
                "matricula = @matricula, sexo = @sexo, endereco = @endereco, " +
                "dnascimento = @dnascimento, estado = @estado, cidade = @cidade, " +
                "nacionalidade = @nacionalidade, filiacaopai = @filiacaopai, " +
                "filiacaomae = @filiacaomae, ID_Turma = @id_turma where id = @id";
            command.Connection = conn;

            command.Parameters.Add(this.novoParametro("nome", DbType.String, vo.Nome));
            command.Parameters.Add(this.novoParametro("@id", DbType.Int32, vo.id));
            command.Parameters.Add(this.novoParametro("matricula", DbType.String, vo.Matricula));
            command.Parameters.Add(this.novoParametro("sexo", DbType.String, vo.Sexo));
            command.Parameters.Add(this.novoParametro("dnascimento", DbType.Date, vo.DataNascimento));
            command.Parameters.Add(this.novoParametro("cidade", DbType.String, vo.Cidade));
            command.Parameters.Add(this.novoParametro("estado", DbType.String, vo.Estado));
            command.Parameters.Add(this.novoParametro("nacionalidade", DbType.String, vo.Nacionalidade));
            command.Parameters.Add(this.novoParametro("filiacaomae", DbType.String, vo.Mae));
            command.Parameters.Add(this.novoParametro("filiacaopai", DbType.String, vo.Pai));
            command.Parameters.Add(this.novoParametro("endereco", DbType.String, vo.Endereco));
            command.Parameters.Add(this.novoParametro("id_turma", DbType.Int32, id_turma));
            try
            {
                abrirConexao();
                retorno = command.ExecuteNonQuery();
                return retorno;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
            finally
            {
                closeConexao();
            }
        }
        
        #endregion
    }
}
 

